package lzc.encrypt;

import com.github.davidmoten.rtree.geometry.Rectangle;
import it.unisa.dia.gas.jpbc.Element;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Random;

/**
 * 辅助类，所有公用方法
 *
 * @author 蓝色的三明治
 * @date 2024/09/20
 */
public class Assit {
    /**
     * 获取哈希值（使用SHA-256算法）
     *
     * @param input 字符数组类型的输入值
     * @return {@link String} 哈希值
     */
    public static String getHash(byte[] input) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");// 创建 MessageDigest 对象，并指定算法（SHA-256）
            byte[] hash = digest.digest(input);// 计算 hash 值
            return java.util.Base64.getEncoder().encodeToString(hash);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("未找到SHA-256算法：" + e.getMessage());
        }
    }

    /**
     * 生成在范围 [lower_limit, upper_limit] 之间的随机大整数
     *
     * @param lower_limit 下限
     * @param upper_limit 上限
     * @return {@link BigInteger} [lower_limit, upper_limit] 之间的随机大整数
     */
    public static BigInteger getRandom(BigInteger lower_limit, BigInteger upper_limit) {
        BigInteger range = upper_limit.subtract(lower_limit).add(BigInteger.ONE);// 计算随机值的范围

        Random rand = new Random();
        BigInteger randomBigInt;

        // 生成在范围 [0, range - 1] 之间的随机大整数
        do {
            randomBigInt = new BigInteger(range.bitLength(), rand);
        } while (randomBigInt.compareTo(range) >= 0);

        return randomBigInt.add(lower_limit);
    }
}
